/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package org.apache.tomcat.util.buf;

import java.io.Serializable;

// XXX Shouldn't be here - has nothing to do with buffers.

/**
 * Main tool for object expiry. Marks creation and access time of an "expirable"
 * object, and extra properties like "id", "valid", etc.
 * 
 * Used for objects that expire - originally Sessions, but also Contexts,
 * Servlets, cache - or any other object that expires.
 * 
 * @author Costin Manolache
 */
public final class TimeStamp implements Serializable {
	private long creationTime = 0L;
	private long lastAccessedTime = creationTime;
	private long thisAccessedTime = creationTime;
	private boolean isNew = true;
	private long maxInactiveInterval = -1;
	private boolean isValid = false;
	MessageBytes name;
	int id = -1;

	Object parent;

	public TimeStamp() {
	}

	// -------------------- Active methods --------------------

	/**
	 * Access notification. This method takes a time parameter in order to allow
	 * callers to efficiently manage expensive calls to
	 * System.currentTimeMillis()
	 */
	public void touch(long time) {
		this.lastAccessedTime = this.thisAccessedTime;
		this.thisAccessedTime = time;
		this.isNew = false;
	}

	// -------------------- Property access --------------------

	/**
	 * Return the "name" of the timestamp. This can be used to associate unique
	 * identifier with each timestamped object. The name is a MessageBytes -
	 * i.e. a modifiable byte[] or char[].
	 */
	public MessageBytes getName() {
		if (name == null)
			name = MessageBytes.newInstance();// lazy
		return name;
	}

	/**
	 * Each object can have an unique id, similar with name but providing faster
	 * access ( array vs. hashtable lookup )
	 */
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	/**
	 * Returns the owner of this stamp ( the object that is time-stamped ). For
	 * a
	 */
	public void setParent(Object o) {
		parent = o;
	}

	public Object getParent() {
		return parent;
	}

	public void setCreationTime(long time) {
		this.creationTime = time;
		this.lastAccessedTime = time;
		this.thisAccessedTime = time;
	}

	public long getLastAccessedTime() {
		return lastAccessedTime;
	}

	public long getThisAccessedTime() {
		return thisAccessedTime;
	}

	/**
	 * Inactive interval in millis - the time is computed in millis, convert to
	 * secs in the upper layer
	 */
	public long getMaxInactiveInterval() {
		return maxInactiveInterval;
	}

	public void setMaxInactiveInterval(long interval) {
		maxInactiveInterval = interval;
	}

	public boolean isValid() {
		return isValid;
	}

	public void setValid(boolean isValid) {
		this.isValid = isValid;
	}

	public boolean isNew() {
		return isNew;
	}

	public void setNew(boolean isNew) {
		this.isNew = isNew;
	}

	public long getCreationTime() {
		return creationTime;
	}

	// -------------------- Maintainance --------------------

	public void recycle() {
		creationTime = 0L;
		lastAccessedTime = 0L;
		maxInactiveInterval = -1;
		isNew = true;
		isValid = false;
		id = -1;
		if (name != null)
			name.recycle();
	}

}
